package com.dao;

import com.bean.Comment;
import com.utils.DBHelper;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.math.BigDecimal;
import java.sql.Connection;
import java.util.List;

public class CommentDao {
    /**
     * 获取所有评论
     * @param id
     * @return
     * @throws Exception
     */
    public List<Comment> getCommentByPostId(int id) throws Exception {
        // 获取连接
        Connection conn = DBHelper.getConnection();
        // 执行 sql 语句，查询到某篇文章，并让评论按时间排序
        String sql = "select id, content, author, created from comment where postId = ? order by created desc";
        System.out.println("查询评论列表的语句是：" + sql);

        try {
            // 创建对象调用方法
            // 文章的评论可能有多条，所以用 BeanListHandler
            return new QueryRunner().query(
                    conn, sql, new BeanListHandler<>(Comment.class), id
            );
        } finally {
            // 关闭连接，释放资源
            DbUtils.closeQuietly(conn);
        }
    }

    /**
     * 增加评论方法
     * @param comment 要增加的对象
     * @return 返回一个带主键的 Comment 对象
     * @throws Exception
     */
    public Comment addComment(Comment comment) throws Exception {
        // 获取连接
        Connection conn = DBHelper.getConnection();
        // 执行 sql 语句
        String sql = "insert into comment (postId, author, content) values (?, ?, ?)";
        System.out.println("添加的语句是：" + sql);

        // 用数组获取参数
        Object[] params = {
                comment.getPost().getId(), comment.getAuthor(), comment.getContent()
        };
        try {
            // 添加的第三个参数，表明需要返回的一个 Long 类型的主键
            // 所以，它返回的就是主键
            // 一般做添加使用 ScalarHandler
            BigDecimal bigDecimal = new QueryRunner().insert(conn, sql, new ScalarHandler<>(), params);
            // 获取 comment 的 id
            comment.setId(bigDecimal.longValue());
            // 返回对象
            return comment;
        } finally {
            // 关闭连接，释放资源
            DbUtils.closeQuietly(conn);
        }
    }

    /**
     * 删除的方法
     * @param id 要删除的参数
     * @throws Exception
     */
    public void delComment(int id) throws Exception {
        // 获取连接
        Connection conn = DBHelper.getConnection();
        // 执行 sql 语句
        String sql = "delete from comment where id = ?";
        System.out.println("要删除的语句是：" + sql);

        try {
            // 创建对象并调用方法
            new QueryRunner().update(conn, sql, id);
        } finally {
            // 关闭连接，释放资源
            DbUtils.closeQuietly(conn);
        }
    }
}
